package com.qst.order.utils;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTException;
import cn.hutool.jwt.JWTUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Date;
@Component
public class JwtUtil {
    // 密钥，实际应用中建议放在配置文件或环境变量中
    @Value("${jwt.secret}")
    private  String SECRET;

    // 过期时间：1小时（单位：毫秒）
    private static final long EXPIRE_TIME = 3600 * 1000;

    /**
     * 生成JWT令牌
     * @param userId 用户ID
     * @param username 用户名
     * @return 生成的JWT令牌
     */
    public  String generateToken(String userId, String username) {
        // 设置payload信息
        Map<String, Object> payload = new HashMap<>();
        // 签发时间
        payload.put(JWT.ISSUED_AT, new Date());
        // 过期时间
        payload.put(JWT.EXPIRES_AT, new Date(System.currentTimeMillis() + EXPIRE_TIME));
        // 签发人
        payload.put(JWT.ISSUER, "your-system-name");
        // 自定义claims
        payload.put("userId", userId);
        payload.put("username", username);

        // 生成token
        return JWTUtil.createToken(payload, SECRET.getBytes());
    }

    /**
     * 验证JWT令牌
     * @param token 待验证的令牌
     * @return 验证成功返回true，否则返回false
     */
    public  boolean verifyToken(String token) {
        try {
            // 验证token
            JWT jwt = JWTUtil.parseToken(token).setKey(SECRET.getBytes());
            return jwt.verify();
        } catch (JWTException e) {
            // 验证失败，可能是签名错误、过期等
            System.out.println("Token验证失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 从JWT令牌中获取信息
     * @param token JWT令牌
     * @param claim 要获取的声明名称
     * @return 声明的值
     */
    public  String getClaim(String token, String claim) {
        if (!verifyToken(token)) {
            return null;
        }
        JWT jwt = JWTUtil.parseToken(token).setKey(SECRET.getBytes());
        return jwt.getPayload().getClaim(claim).toString();
    }

}
